# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-08-10
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
import os.path

from 神笔码靓.码靓库.头像.元素神笔模板 import 头像元素神笔模板
from 神笔码靓.码靓库.头像.头像文件定义 import 头像部件配置, 头像部件微调
from 神笔码靓.码靓库.头像.头像颜色定义 import 常见发色
from 神笔码靓.神笔库 import 神笔模板, 神笔绘图板
from 神笔码靓.神笔库.元素库 import 可变换元素
from 神笔码靓.神笔库.线条工具集 import *
from 神笔码靓.神笔库.通用工具集 import *


class 头像神笔模板(神笔模板):
    面部宽度缩放 = {
        "女/面部01": 1,
        "女/面部02": 1.15,
        "男/面部01": 1,
        "男/面部02": 1.15
    }
    头发裁剪路径 = {
        "女/头发02": [("移动", 0, 0), ("垂直线", 143), ("水平线", 320), ("垂直线", 0), ("闭合",)]
    }
    # 开始X, 开始Y = 路径参数.get("开始", (80, 120))
    #         宽度 = 路径参数.get("宽度", 240)
    #         中间线Y = 路径参数.get("中间线Y", 170)
    #         中间线X = 路径参数.get("中间线X", 52)
    帽子裁剪路径 = {
        "帽子01": {"开始": (90, 120), "宽度": 220, "中间线Y": 200},
        "帽子10": {"开始": (90, 130), "宽度": 220, "中间线Y": 200},
        "帽子15": {"开始": (90, 113), "宽度": 220},
        "帽子16": {"开始": (90, 113), "宽度": 220},
        "帽子18": {"开始": (90, 60), "宽度": 220},

    }

    def 帽子路径构建(self, 帽子文字=None):
        路径参数 = self.帽子裁剪路径.get(帽子文字, {})

        开始X, 开始Y = 路径参数.get("开始", (80, 120))
        宽度 = 路径参数.get("宽度", 240)
        中间线Y = 路径参数.get("中间线Y", 170)
        中间线X = 路径参数.get("中间线X", 52)

        路径 = [("移动", 开始X, 开始Y),
              ("水平线", 宽度),
              ("椭圆弧线", 60, 60, 0, 0, 1, 320 - 中间线X, 中间线Y),
              ("椭圆弧线", 1500, 600, 0, 0, 0, 280, 322),
              ("水平线", 40),
              ("椭圆弧线", 1500, 600, 0, 0, 0, 中间线X, 中间线Y),
              ("椭圆弧线", 60, 60, 0, 0, 1, 开始X, 开始Y),
              ("闭合",)]
        return 路径

    def 模板ID(self):
        return "头像"

    def 后发部件(self, 后发文件, 性别, 后发颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.后发", 文件=后发文件, 性别=性别,
                        替换颜色=后发颜色).创造元素()

    def 头发部件(self, 头发文件, 性别, 头发颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.头发", 文件=头发文件, 性别=性别,
                        替换颜色=头发颜色).创造元素()

    def 上身部件(self, 上身文件, 性别, 皮肤颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.上身", 文件=上身文件, 性别=性别, 替换颜色=皮肤颜色).创造元素()

    def 耳朵部件(self, 耳朵文件, 皮肤颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.耳朵", 文件=耳朵文件, 替换颜色=皮肤颜色).创造元素()

    def 面部部件(self, 面部文件, 性别, 皮肤颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.面部", 文件=面部文件, 性别=性别,
                        替换颜色=皮肤颜色).创造元素()

    def 嘴巴部件(self, 嘴巴文件, 性别):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.嘴巴", 文件=嘴巴文件, 性别=性别).创造元素()

    def 眼睛部件(self, 眼睛文件, 性别):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.眼睛", 文件=眼睛文件, 性别=性别).创造元素()

    def 眉毛部件(self, 眉毛文件, 性别, 眉毛颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.眉毛", 文件=眉毛文件, 性别=性别,
                        替换颜色=[眉毛颜色, 常见发色.颜色加深(眉毛颜色)]).创造元素()

    def 胡须部件(self, 胡须文件, 性别, 胡须颜色):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.胡须", 文件=胡须文件, 性别=性别,
                        替换颜色=[胡须颜色, 常见发色.颜色加深(胡须颜色)]).创造元素()

    def 鼻子部件(self, 鼻子文件, 性别):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.鼻子", 文件=鼻子文件, 性别=性别).创造元素()

    def 眼镜部件(self, 眼镜文件):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.眼镜", 文件=眼镜文件).创造元素()

    def 帽子部件(self, 帽子文件):
        绘图板 = self.绘图板
        return 绘图板.神笔模板("头像.帽子", 文件=帽子文件).创造元素()

    def 微调部件(self, 部件: 可变换元素, 部件微调: 头像部件微调):

        def 根据缩放值计算平移量(x, y, x_scale, y_scale):
            translate_x = -(x * x_scale - x) / x_scale
            translate_y = -(y * y_scale - y) / y_scale
            return translate_x, translate_y

        部件上下 = 部件微调.上下
        部件左右 = 部件微调.左右
        部件旋转 = 部件微调.旋转
        部件缩放 = 部件微调.缩放
        垂直翻转 = 部件微调.垂直翻转
        水平翻转 = 部件微调.水平翻转

        中心基准x, 中心基准y = 160, 160

        if 部件上下 != 0 or 部件左右 != 0:
            if abs(部件上下) >= 1 or abs(部件左右) >= 1:
                raise Exception("微调部件的上下左右值范围为(0.0 ~ 1.0 之间)")
            部件.平移(部件左右 * 320, 部件上下 * 320)

        if 部件旋转 != 0:
            部件.旋转(部件旋转, 旋转中心点=(160, 160))

        if 部件缩放 != 1.0:
            if isinstance(部件缩放, tuple):
                scale_x, scale_y = 部件缩放
                translate_x, translate_y = 根据缩放值计算平移量(中心基准x, 中心基准y, scale_x, scale_y)
                部件.缩放(scale_x, scale_y).平移(translate_x, translate_y)
            else:
                translate_x, translate_y = 根据缩放值计算平移量(中心基准x, 中心基准y, 部件缩放, 部件缩放)
                部件.缩放(部件缩放).平移(translate_x, translate_y)

        if 垂直翻转:
            部件.垂直翻转()
            部件.平移(-320, 0)

        if 水平翻转:
            部件.水平翻转()
            部件.平移(0, -320)

    def 元素列表(self):
        绘图板 = self.绘图板
        元素列表_ = 列表()

        部件配置 = self.获取参数("部件配置", None)

        if 部件配置 is None:
            部件配置 = 头像部件配置()

        部件微调列表 = []

        if 部件配置.面部微调 is not None:
            部件微调列表.append(("面部", 部件配置.面部微调))
        if 部件配置.鼻子微调 is not None:
            部件微调列表.append(("鼻子", 部件配置.鼻子微调))
        if 部件配置.眼睛微调 is not None:
            部件微调列表.append(("眼睛", 部件配置.眼睛微调))
        if 部件配置.耳朵微调 is not None:
            部件微调列表.append(("耳朵", 部件配置.耳朵微调))
        if 部件配置.上身微调 is not None:
            部件微调列表.append(("上身", 部件配置.上身微调))
        if 部件配置.嘴巴微调 is not None:
            部件微调列表.append(("嘴巴", 部件配置.嘴巴微调))
        if 部件配置.眼镜微调 is not None:
            部件微调列表.append(("眼镜", 部件配置.眼镜微调))
        if 部件配置.头发微调 is not None:
            部件微调列表.append(("头发", 部件配置.头发微调))
        if 部件配置.眉毛微调 is not None:
            部件微调列表.append(("眉毛", 部件配置.眉毛微调))
        if 部件配置.胡须微调 is not None:
            部件微调列表.append(("胡须", 部件配置.胡须微调))
        if 部件配置.帽子微调 is not None:
            部件微调列表.append(("帽子", 部件配置.帽子微调))

        头发文件 = 部件配置.头发
        面部文件 = 部件配置.面部
        肤色 = 部件配置.肤色
        性别 = 部件配置.性别
        帽子文件 = 部件配置.帽子
        眼睛文件 = 部件配置.眼睛
        眼镜文件 = 部件配置.眼镜
        眼镜在头发前 = 部件配置.眼镜在头发前
        胡须文件 = 部件配置.胡须
        胡须颜色 = 部件配置.胡须颜色
        上身文件 = 部件配置.上身
        眉毛文件 = 部件配置.眉毛
        眉毛颜色 = 部件配置.眉毛颜色
        鼻子文件 = 部件配置.鼻子
        嘴巴文件 = 部件配置.嘴巴
        耳朵文件 = 部件配置.耳朵
        头发颜色 = 部件配置.头发颜色

        头发裁剪路径 = self.头发裁剪路径.get(f"{性别}/{头发文件}", None)

        发宽缩放 = self.面部宽度缩放.get(f"{性别}/{面部文件}", 1.0)

        后发颜色 = None

        # 绘图板.画矩形(x=0, y=0, 宽=200, 高=200).添加到列表(元素列表_)
        if 部件配置.显示边框:
            边框 = 绘图板.画矩形(x=0, y=0, 宽=320, 高=320, 描边宽度=20, 描边颜色=颜色.蓝色).透明度(0.5).添加到列表(元素列表_)

        头发元素列表 = []
        头发文件_ = f"{性别}/{头发文件}"
        后发文件_ = 头发文件_.replace("头发", "后发")
        头像根目录 = 资源库目录(头像元素神笔模板.头像根目录)
        if os.path.exists(os.path.join(头像根目录, 后发文件_ + ".svg")) and 后发颜色 is None:
            后发文件 = 头发文件.replace("头发", "后发")
            后发 = self.后发部件(后发文件=后发文件, 性别=性别,
                           后发颜色=[头发颜色, 常见发色.颜色加深(头发颜色)]).添加到列表(元素列表_).添加到列表(头发元素列表)
        else:
            后发 = None

        # if 头发裁剪路径 and 头发文件:
        #     头发路径 = self.头发部件(头发文件=头发文件, 性别=性别,
        #                      头发颜色=头发颜色).添加到列表(头发元素列表)#.添加到列表(元素列表_)
        # else:
        #     头发路径 = None

        上身 = self.上身部件(上身文件=上身文件, 性别=性别,
                       皮肤颜色=[肤色, 常见发色.颜色加深(肤色),
                             常见发色.颜色加深(肤色, 0.1)]).添加到列表(元素列表_).添加到列表(头发元素列表)

        耳朵 = self.耳朵部件(耳朵文件=耳朵文件, 皮肤颜色=[肤色, 常见发色.颜色加深(肤色)]).添加到列表(元素列表_)
        面部 = self.面部部件(面部文件=面部文件, 性别=性别, 皮肤颜色=[肤色, 常见发色.颜色加深(肤色)]).添加到列表(元素列表_)
        嘴巴 = self.嘴巴部件(嘴巴文件=嘴巴文件, 性别=性别).添加到列表(元素列表_)
        眼睛 = self.眼睛部件(眼睛文件=眼睛文件, 性别=性别).添加到列表(元素列表_)

        if 眉毛文件:
            if not 眉毛颜色:
                眉毛颜色 = 头发颜色
            if not 眉毛颜色:
                眉毛颜色 = 颜色.黑色
            眉毛 = self.眉毛部件(眉毛文件=眉毛文件, 性别=性别, 眉毛颜色=眉毛颜色).添加到列表(元素列表_)
        else:
            眉毛 = None

        if 胡须文件:
            if not 胡须颜色:
                胡须颜色 = 头发颜色
            if not 胡须颜色:
                胡须颜色 = 颜色.黑色
            胡须 = self.胡须部件(胡须文件=胡须文件, 性别=性别, 胡须颜色=胡须颜色).添加到列表(元素列表_)
        else:
            胡须 = None

        鼻子 = self.鼻子部件(鼻子文件=鼻子文件, 性别=性别).添加到列表(元素列表_)
        if not 眼镜在头发前:
            if 眼镜文件:
                眼镜 = self.眼镜部件(眼镜文件=眼镜文件).添加到列表(元素列表_)
            else:
                眼镜 = None

        if 头发文件:
            头发 = self.头发部件(头发文件=头发文件, 性别=性别,
                           头发颜色=[头发颜色, 常见发色.颜色加深(头发颜色)]).添加到列表(元素列表_).添加到列表(头发元素列表)
            if 头发裁剪路径:
                绘图板.裁剪(裁剪元素_=绘图板.连线(路径点列表=头发裁剪路径), 被裁元素=头发)
        else:
            头发 = None

        if 眼镜在头发前:
            if 眼镜文件:
                眼镜 = self.眼镜部件(眼镜文件=眼镜文件).添加到列表(元素列表_)
            else:
                眼镜 = None

        if 帽子文件:
            帽子 = self.帽子部件(帽子文件=帽子文件).添加到列表(元素列表_)

            if 头发:
                帽子裁剪路径 = self.帽子路径构建(f"{帽子文件}")
                if 帽子裁剪路径:
                    路径裁剪 = 绘图板.连线(路径点列表=帽子裁剪路径)  # .添加到列表(元素列表_)
                    绘图板.裁剪(裁剪元素_=路径裁剪, 被裁元素=头发).添加到列表(元素列表_)

                    setattr(帽子, "联动部件", 路径裁剪)
                    setattr(头发, "联动部件", 路径裁剪)
        else:
            帽子 = None

        if 发宽缩放 != 1.0:
            def 根据缩放值计算X平移量(x, scale_factor):
                translate_x = -(x * scale_factor - x) / scale_factor
                return translate_x

            translate_x = 根据缩放值计算X平移量(160, 发宽缩放)

            for 头发元素_ in 头发元素列表:
                头发元素_.缩放(发宽缩放, 1.0).平移(translate_x, 0)

            if 耳朵:
                耳朵.缩放(发宽缩放, 1.0).平移(translate_x, 0)

            if 眼镜:
                眼镜.缩放(发宽缩放, 1.0).平移(translate_x, 0)

            if 胡须:
                胡须.缩放(发宽缩放, 1.0).平移(translate_x, 0)

            if 帽子:
                帽子.缩放(发宽缩放, 1.0).平移(translate_x, 0)

        for 部件名, 微调 in 部件微调列表:
            部件 = eval(部件名)
            if 部件名 == "头发":
                if 头发:
                    self.微调部件(头发, 微调)
                if 后发:
                    self.微调部件(后发, 微调)
            else:
                self.微调部件(部件, 微调)

            if hasattr(部件, "联动部件"):
                self.微调部件(部件.联动部件, 微调)

        return 元素列表_
